// src/utils/errorHandler.js
import { ElMessage, ElMessageBox } from 'element-plus';
import router from '@/router';
import { useUserStore } from '@/store';
import { smartTranslate as $t } from '@/lang';

class ErrorHandler {
  /**
   * 处理业务逻辑错误（HTTP 200，但业务码非成功）
   * @param {string} message 错误信息
   * @param {number} code 业务错误码
   */
  handleBusinessError({ success, code, data, message }) {
    console.error(`Business Error (Code: ${code}): ${message}`);
    // 执行错误时，统一给用户提示（调用时不需要处理）
    ElMessage.error(
      message || $t('common.message.error.operation_failed', '操作失败'),
    );
    // 返回给调用方判断请求是否成功
    return { success, code, data, message };
  }

  /**
   * 处理HTTP层面的错误（非2xx状态码）
   * @param {Error} error Axios错误对象
   */
  handleHttpError(error) {
    if (error.response) {
      const { status, data } = error.response;
      const message = data?.message || `http.${status} - 服务器错误`;
      console.error(`HTTP Error ${status}:`, error.response);
      ElMessage.error(message);
    } else if (error.request) {
      console.error('Network Error:', error.request);
      ElMessage.error(
        $t('common.message.error.network_timeout', '网络请求已超时'),
      );
    } else {
      console.error('Request Setup Error:', error.message);
      ElMessage.error(
        error.message || $t('common.message.error.request_failed', '请求失败'),
      );
    }
  }

  /**
   * 处理需要强制用户登出的情况（Token无效、被禁用等）
   * @param {string} message 提示信息
   */
  async handleSessionExpired(message) {
    // 使用 ElMessageBox 强制用户交互
    await ElMessageBox.confirm(
      message || $t('common.message.error.session_expired', '会话已过期'),
      $t('common.title.notice', '提示'),
      {
        type: 'warning',
        confirmButtonText: $t('common.button.re_login', '重新登录'),
        showCancelButton: false, // 通常不给用户取消的机会
      },
    );

    // 清理用户状态并平滑跳转到登录页
    await useUserStore().clearUserSession();
    const currentPath = router.currentRoute.value.fullPath;
    router.push(`/login?redirect=${encodeURIComponent(currentPath)}`);
  }
}

export const errorHandler = new ErrorHandler();
